// poj3963
// 题意：给定n个士兵位置，m个避难所位置（一维位置），每个士兵都要去一个
//       避难所。每个避难所至少要有个士兵。士兵去一个避难所的费用是两者
//       的距离，问最小的费用是多少。
//
// 题解：dp。不过内存限制和输出方案非常烦。做的时候比较晕，wa了n次，最后
//       写了对拍和spj才过的。
//
// 统计：8422ms，
//
// run: $exec < bfdiff.in
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <utility>

long long const inf = (long long)(1) << 60;
int const maxn = 4004;
std::pair<long long, int> a[maxn], b[maxn];
long long dp[2][maxn];
bool from[maxn][maxn];
short to[maxn];
int n, m;

template <class T>
T myabs(T const & a) { return (a >= 0 ? a : -a); }

void print()
{
	for (int i = n, j = m; i; i--) {
		to[a[i].second] = b[j].second;
		if (from[i][j]) j = j - 1;
	}
	std::printf("%d", to[1]);
	for (int i = 2; i <= n; i++)
		std::printf(" %d", to[i]);
	std::printf("\n");
}

int main()
{
	std::scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		std::scanf("%lld", &a[i].first);
		a[i].second = i;
	}
	std::sort(a + 1, a + n + 1);
	std::scanf("%d", &m);
	for (int i = 1; i <= m; i++) {
		std::scanf("%lld", &b[i].first);
		b[i].second = i;
	}
	std::sort(b + 1, b + m + 1);

	for (int i = 1; i <= m; i++) dp[0][i] = inf;
	int now = 0, prev = 0;
	for (int i = 1; i <= n; i++) {
		prev = now; now ^= 1;
		dp[now][0] = inf;
		for (int j = 1; j <= m; j++) {
			dp[now][j] = inf;
			long long ret = myabs(a[i].first - b[j].first);
			if (dp[prev][j - 1] < dp[prev][j]) {
				dp[now][j] = dp[prev][j - 1] + ret;
				from[i][j] = 1;
			} else {
				dp[now][j] = dp[prev][j] + ret;
				from[i][j] = 0;
			}
//			std::cout << dp[i][j] << ' ';
		}
//		std::cout << '\n';
	}

	std::printf("%lld\n", dp[now][m]);
	print();
}
